/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.EpicrisisInternacionFisica;
import hibernate.objeto.Cie9mc;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EpicrisisInternacion;
import hibernate.objeto.Paciente;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class EpicrisisInternacionLogica extends CapaLogica {

    /**
     * Crea y persiste la epicrisis para la internación del paciente.
     *
     * @param datosEpicrisisInternacion Los datos a cargar correspondientes a
     * la epicrisis
     * @param diagnosticoYTriageInternacion El diagnsotico de internación asociado
     * @param paciente El objeto Paciente
     * @param idEpicrisisInternacion El arreglo en donde se guarda el id del objeto
     * creado para su posterior recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarEpicrisisInternacion(Object[] datosEpicrisisInternacion,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion,
            Paciente paciente, int[] idEpicrisisInternacion) {
        Cie9mc cie9mcAnterior = null;
        //Si es una modificacion
        if (idEpicrisisInternacion[0] != -1) {
            //Escribe el log
            backUpModificacion(idEpicrisisInternacion[0]);
            cie9mcAnterior = diagnosticoYTriageInternacion.
                    getEpicrisisInternacion().getCie9mc();
        }
        
        EpicrisisInternacion epicrisisInternacion =
                crearUObtenerObjetoEpicrisisInternacion(
                datosEpicrisisInternacion, diagnosticoYTriageInternacion);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(epicrisisInternacion)) {
            diagnosticoYTriageInternacion.setEpicrisisInternacion(epicrisisInternacion);
            //Una vez que se crea, se vincula a la internación la epicrisis creada
            DiagnosticoYTriageInternacionLogica.actualizarEpicrisisInternacion(
                    epicrisisInternacion, diagnosticoYTriageInternacion);

            //Si es modificacion elimina la enfermedad anterior de antecedentes
            if (idEpicrisisInternacion[0] != -1) {
                AntecedentePersonalLogica.eliminarAntecedentePorCie9mc(
                        cie9mcAnterior);
            }

            //Setea el antecedente correspondiente
            AntecedentePersonalLogica.setearEnfermedadComoAntecedente(
                    paciente, diagnosticoYTriageInternacion);
            

            idEpicrisisInternacion[0] = epicrisisInternacion.getIdEpicrisisInternacion();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto EpicrisisInternacion con los datos pasados por parámetro.
     *
     * @param datosEpicrisisInternacion Los datos a cargar
     * @param diagnosticoYTriageInternacion El DiagnosticoYTriageInternacion
     * @return El objeto EpicrisisInternacion creado
     */
    private static EpicrisisInternacion crearUObtenerObjetoEpicrisisInternacion(
            Object[] datosEpicrisisInternacion,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion) {
        EpicrisisInternacion epicrisisInternacion = new EpicrisisInternacion();

        //Si es una modificacion
        if (diagnosticoYTriageInternacion.getEpicrisisInternacion() != null) {
            epicrisisInternacion =
                    diagnosticoYTriageInternacion.getEpicrisisInternacion();
        }

        epicrisisInternacion.setHoraEpicrisisInternacion(
                datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_HORA].toString());

        epicrisisInternacion.setFechaEpicrisisInternacion(
                (Date) datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_FECHA]);

        epicrisisInternacion.setCie9mc(
                (Cie9mc) datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_CIE9MC]);
        
        epicrisisInternacion.setNombreProfesionalEpicrisisInternacion(
                capitalizeFirstLetter(datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_NOMBRE_PROFESIONAL].toString()));

        epicrisisInternacion.setApellidoProfesionalEpicrisisInternacion(
                capitalizeFirstLetter(datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_APELLIDO_PROFESIONAL].toString()));

        epicrisisInternacion.setInformacionComplementariaEpicrisisInternacion(
                datosEpicrisisInternacion[
                EPICRISIS_INTERNACION_INFORMACION_COMPLEMENTARIA].toString());

        return epicrisisInternacion;
    }

    /**
     * Retorna el objeto EpicrisisInternacion según el id.
     *
     * @param idEpicrisisInternacion El id de la EpicrisisInternacion
     * @return El objeto EpicrisisInternacion consultado, null si no existe
     */
    public static EpicrisisInternacion getEpicrisisInternacionPorId(
            int idEpicrisisInternacion) {
        return EpicrisisInternacionFisica.getEpicrisisInternacionPorId(
                idEpicrisisInternacion);
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    EpicrisisInternacion.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        EpicrisisInternacion epicrisisInternacion =
                EpicrisisInternacionLogica.getEpicrisisInternacionPorId(idObjeto);

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                epicrisisInternacion.getArchivoLogEpicrisisInternacion());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogEpicrisisInternacion(epicrisisInternacion, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        epicrisisInternacion.setArchivoLogEpicrisisInternacion(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param epicrisisInternacion El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogEpicrisisInternacion(
            EpicrisisInternacion epicrisisInternacion, String rutaLog) {
        try {
            //EpicrisisInternacion
            String epicrisisInternacionString = getEpicrisisInternacionString(
                    epicrisisInternacion);
            
            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            epicrisisInternacionString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(epicrisisInternacionString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto EpicrisisInternacion en string.
     *
     * @param epicrisisInternacion El objeto a escribir
     */
    public static String getEpicrisisInternacionString(
            EpicrisisInternacion epicrisisInternacion) {
        String epicrisisInternacionString =
                    "idEpicrisisInternacion: " +
                    epicrisisInternacion.getIdEpicrisisInternacion() + "\n" +
                    "horaEpicrisisInternacion: " +
                    epicrisisInternacion.getHoraEpicrisisInternacion() + "\n" +
                    "fechaEpicrisisInternacion: " +
                    epicrisisInternacion.getFechaEpicrisisInternacion() + "\n" +
                    "apellidoProfesionalEpicrisisInternacion: " +
                    epicrisisInternacion.getApellidoProfesionalEpicrisisInternacion() + "\n" +
                    "nombreProfesionalEpicrisisInternacion: " +
                    epicrisisInternacion.getNombreProfesionalEpicrisisInternacion() + "\n";
        
        epicrisisInternacionString +=
                Cie9mcLogica.getCie9mcString(
                epicrisisInternacion.getCie9mc());

        epicrisisInternacionString +=
                "informacionComplementariaEpicrisisInternacion: " +
                epicrisisInternacion.getInformacionComplementariaEpicrisisInternacion() + "\n";

        return epicrisisInternacionString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la epicrisis
     * de la internación.
     *
     * @param epicrisisInternacion La epicrisis correspondiente a la práctica ambulatoria
     * o de internación
     * @return El String que contiene el HTML
     */
    public static String getEpicrisisHTML(
            EpicrisisInternacion epicrisisInternacion) {

        String epicrisisHTML = "";

        if (epicrisisInternacion != null) {
      epicrisisHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">EPICRISIS</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(epicrisisInternacion.getFechaEpicrisisInternacion())  + " - " +
                    epicrisisInternacion.getHoraEpicrisisInternacion() + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Evolucionó: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    epicrisisInternacion.getApellidoProfesionalEpicrisisInternacion() + ", " + epicrisisInternacion.getNombreProfesionalEpicrisisInternacion()  + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Nombre enfermedad: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    epicrisisInternacion.getCie9mc().getDetalleCie9mc() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Información complementaria: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    epicrisisInternacion.getInformacionComplementariaEpicrisisInternacion() + "</font><br><br>";
        } else {
            epicrisisHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">EPICRISIS</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }
        return epicrisisHTML;
    }

}
